/* 策略模式 */
// 策略对象
const strategies = {
  add: function (x, y) {
    return x + y;
  },
  
  subtract: function (x, y) {
    return x - y;
  },

  multiply: function (x, y) {
    return x * y;
  },

};

// 上下文对象
function calculate(strategy, x, y) {
  if (strategy in strategies) {
    return strategies[strategy](x, y);
  } else {
    throw new Error("Invalid strategy");
  }
}

// 使用策略模式
console.log(calculate("add", 5, 3)); // 输出：8
console.log(calculate("subtract", 5, 3)); // 输出：2
console.log(calculate("multiply", 5, 3)); // 输出：15

/* 
策略模式在以下场景中特别有用：

1. 条件分支逻辑：当存在多个条件分支需要根据不同的情况执行不同的操作时，可以使用策略模式。它可以避免使用大量的if-else或switch语句，使代码更清晰、可读性更高。

2. 计算或算法选择：当需要在运行时选择不同的计算方法或算法时，可以使用策略模式。这在数学计算、数据处理或优化问题中特别常见。

3. 表单验证：在表单验证场景中，可以使用策略模式来定义和处理不同类型的验证规则。这样可以根据表单字段的类型和验证要求，动态选择相应的验证策略。

4. 日志记录：在日志记录中，可以使用策略模式来定义不同的日志记录方式或级别。通过策略模式，可以很方便地根据需要选择记录到文件、数据库、控制台等不同目标的日志策略。

5. 缓存管理：在缓存管理中，可以使用策略模式来决定何时以及如何更新缓存。通过策略模式，可以根据不同的缓存策略（如FIFO、LRU等）选择相应的缓存更新策略。

6. 排序算法：当需要对一组数据进行排序时，可以使用策略模式来选择不同的排序算法。通过策略模式，可以根据数据的特征和需求选择最合适的排序算法。

7. 图像处理：在图像处理过程中，可能需要根据不同的图像格式或要求选择不同的处理策略。策略模式可以使得图像处理过程更灵活、可扩展。

总之，策略模式适用于任何需要在运行时根据不同条件选择不同行为的情况。它能够提供灵活的方式来管理复杂的逻辑，并使代码更具可读性和可维护性。
*/